package paginas;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

import modelUtil.Configuracion;
import modelUtil.Util;
import usuario.usuarioTO.UsuarioTO;
import util.BotonPersonalizado;
import util.TecladoUsuarios;
import util.TransicionBotones;
import AccionBoton.AccionFocoCreditos;
import AccionBoton.AccionFocoVentana;
import AccionBoton.AccionIrTeclado;
import AccionBoton.AccionLanzarAyuda;
import AccionBoton.AccionLanzarCreditos;
import AccionBoton.AccionMostrarMenuAdmin;
import AccionBoton.AccionPageByPageUsuarios;
import AccionBoton.AccionPopUp;
import AccionBoton.AccionSalir;
import fachadaUsuario.delegate.UsuarioFacade;

public class PaginaUsuarios extends JPanel {

	private static final long serialVersionUID = 1;
	private JMenuBar _menubarra = new JMenuBar();
	private JPanel _panelBotones = new JPanel();
	private BotonPersonalizado _seleccionado;
	private JFrame _frame;
	private ArrayList <BotonPersonalizado> _botones;
	private int _startIndex;
	private int _count;
	private JMenuItem item1;
	private JMenuItem item2;
	private TransicionBotones policy;
	private ArrayList <BotonPersonalizado> botones;
	private Boolean _test = false;
	private UsuarioTO _user;
	private AccionFocoVentana foco;
	private Vector<Component> order;
	
	private Dimension sc = Toolkit.getDefaultToolkit().getScreenSize();
	private String os;
	private int altoDock;
	
    public PaginaUsuarios(JFrame frame, int startIndex, int count) {
    	_frame = frame;
    	_frame.setAlwaysOnTop(false);
    	_frame.setFocusableWindowState(true);
  
    	os = System.getProperty("os.name");
   	    altoDock = (new Double(sc.getWidth()*0.045)).intValue();

    	_startIndex = startIndex;
    	_count = count;
    	if(_test){
    	Configuracion.instancia().setTest("Si");}else{
    		
    	Configuracion.instancia().setTest("No");
    	}

        initComponents();
    	//_frame.setLocation(0, 0);
    	_frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        order = new Vector<Component>(botones.size());
        order.add(item1);
        order.add(item2);
        for(int i = 0; i<botones.size();i++){
        	order.add(botones.get(i));
        	
        }

        foco = new AccionFocoVentana(botones.get(0));
        
        _frame.addWindowFocusListener(foco);
       _frame.setFocusable(true);

        new TecladoUsuarios(_frame, _botones, Configuracion.instancia().getBarrido().equals("Si"), ( new Double(new Double( Configuracion.instancia().getTiempoBarrido() )*1000).intValue()));
        
        policy = new TransicionBotones(order);
       if(Configuracion.instancia().getBarrido().equals("No")){
        _frame.setFocusTraversalPolicy(policy);
        _frame.setFocusableWindowState(true);
        _frame.requestFocus();}
        _frame.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height-altoDock));
        _frame.pack();
        _frame.repaint();
    }
    
    public PaginaUsuarios(JFrame frame, int startIndex, int count,Boolean test,UsuarioTO user) {
    	_frame = frame;
    	_frame.setAlwaysOnTop(false);
    	_frame.setFocusableWindowState(true);
    	_startIndex = startIndex;
    	_count = count;
    	_test = test;
    	_user= user;
    	
    	os = System.getProperty("os.name");
   	    altoDock = (new Double(sc.getWidth()*0.045)).intValue();
    	
    	Configuracion.instancia().setUser(_user);
    	
    	if(_test){
        	Configuracion.instancia().setTest("Si");}else{
        		
        	Configuracion.instancia().setTest("No");
        	}
    	
        initComponents();
    	_frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

        Vector<Component> order = new Vector<Component>(botones.size());
        order.add(item1);
        order.add(item2);
        for(int i = 0; i<botones.size();i++){
        	order.add(botones.get(i));
        	
        }


        _frame.addWindowFocusListener(new WindowAdapter() {
    	    public void windowGainedFocus(WindowEvent e) {
    		    botones.get(0).requestFocusInWindow(); 

    	    }
    	});
        new TecladoUsuarios(_frame, _botones, Configuracion.instancia().getBarrido().equals("Si"), ( new Double(new Double( Configuracion.instancia().getTiempoBarrido() )*1000).intValue()));

       _frame.setFocusable(true);
       policy = new TransicionBotones(order);
       _frame.setFocusTraversalPolicy(policy);
       _frame.setFocusableWindowState(true);
       _frame.requestFocus();
	    //botones.get(0).requestFocusInWindow(); 

       _frame.setPreferredSize(sc);
  		_frame.pack();
        _frame.repaint();
    }
	
    private void initComponents() {
    	GridBagLayout grid = new GridBagLayout();
    	GridBagConstraints cons = new GridBagConstraints();
    	this.setLayout(grid);
    	
    	crearMenuBarra();
    	crearCuerpoVentana();
    	cons.gridheight = 1;
    	cons.gridwidth = 1;
    	cons.fill = GridBagConstraints.BOTH;
    	cons.gridx = 0;
    	cons.gridy = 0;
    	grid.addLayoutComponent(_menubarra, cons);
    	this.add(_menubarra);
    	cons.gridy = 1;
    	grid.addLayoutComponent(_panelBotones, cons);
    	this.add(_panelBotones);
    	_frame.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height-altoDock));
        _frame.pack();
        _frame.repaint();
    	
    	
    }
    
    public void crearMenuBarra(){
    	item1 = new JMenuItem(ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_boton_ayuda_usuarios"));
    	item1.setMnemonic(KeyEvent.VK_A);
    	item1.addActionListener(new AccionLanzarAyuda(_frame));
    	item2 = new JMenuItem(ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_boton_creditos_usuarios"));
    	item2.setMnemonic(KeyEvent.VK_C);
    	item2.addActionListener(new AccionLanzarCreditos(_frame));
    	item1.setFocusable(true);
    	item2.setFocusable(true);
 
       	FlowLayout flow = new FlowLayout();
       	flow.setAlignment(FlowLayout.LEFT);
       	_menubarra.setLayout(flow);
    	item1.setPreferredSize(new Dimension(150, 25));
    	item2.setPreferredSize(new Dimension(150, 25));
    	_menubarra.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize().width, 30));
    	flow.addLayoutComponent("item1", item1);
    	_menubarra.add(item1);
    	flow.addLayoutComponent("item2", item2);
    	_menubarra.add(item2);
    	_frame.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height-altoDock));
        _frame.pack();
        _frame.repaint();
    }
    
    public BotonPersonalizado getSeleccionado() {
		return _seleccionado;
	}

	public void setSeleccionado(BotonPersonalizado seleccionado) {
		_seleccionado = seleccionado;
	}
    
    public void crearCuerpoVentana(){
    	
        GridBagLayout gridbag = new GridBagLayout();
        GridBagConstraints c = new GridBagConstraints();
     	c.fill = GridBagConstraints.BOTH;
        c.weightx = 1.0;
        c.weighty = 1.0;
        _panelBotones.setLayout(gridbag);
    	_panelBotones.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height-altoDock));
        int ultimo=0;
    	UsuarioFacade fachada = new UsuarioFacade();
    	List <String> usuarios = fachada.ListarUsuarios();
        int nUsuarios = usuarios.size();

    	botones = new ArrayList<BotonPersonalizado>();
    	UsuarioTO user;
    	int last = _startIndex+_count;
    	for(int i = _startIndex; i<last;i++){
    		//Evitamos que salga el .svn en pantalla
    		if(i<usuarios.size()){
    		if(!usuarios.get(i).equals(".svn")){

    			user = fachada.BuscarUsuario(usuarios.get(i));
    			BotonPersonalizado b;
    			if(user.getAdministrador().equals("Si")){
    			b = Util.BotonUsuario(user.getNombre(), "lib/Resources/Admin.png");
    			}else{
    				
    			b = Util.BotonUsuario(user.getNombre(), user.getImagen());
    			}
    			
    			b.setFocusable(true);
    			/*b.setBorder(new LineBorder(Color.black, 10));
    			b.addMouseListener(new accionRaton(b, Color.orange));
    			b.setColorMouseOver(Color.orange);*/
    			b.addFocusListener(new AccionFocoCreditos(b));
    			b.setPreferredSize(new Dimension(_panelBotones.getHeight()/3,_panelBotones.getWidth()/5));
    			if(user.getAdministrador().equals("Si")){
    				b.addActionListener(new AccionPopUp(user,_frame));
    				b.setBorder(new LineBorder(Color.red, 10));

    			}else{ 
    			b.addActionListener(new AccionIrTeclado(_frame, "LanzarTecladoPrincipal", user));}
    			b.setPreferredSize(new Dimension(_panelBotones.getHeight()/3,_panelBotones.getWidth()/5));
    			Util.redimensionar(b);

    			//Util.desactivarUsuario(b);
    			if(user.getAdministrador().equals("Si")){
    				b.getLabelTexto().setText("Admin");
    				botones.add(0, b);
    				
    			}else{

    			botones.add(b);
    			
    			}
    			if(_test){
        			if(user.getAdministrador().equals("Si")){
        				
        				botones.remove(b);
        				ultimo--;
        				last++;
        			}
    				
    			}
    			
    			ultimo++;
    				
    			
    		}else{last++;
    		nUsuarios--;
    			
    		}
    		}
    		
    	}
    	
    	if(_startIndex>0){
    		
    		botones.remove(ultimo-1);
        	BotonPersonalizado anterior = Util.BotonUsuario(ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_anterior_usuarios"), "lib//Resources//anterior.png");
			anterior.setFocusable(true);
   			/*anterior.setBorder(new LineBorder(Color.black, 10));
			anterior.addMouseListener(new accionRaton(anterior, Color.orange));
			anterior.setColorMouseOver(Color.orange);*/
			anterior.addFocusListener(new AccionFocoCreditos(anterior));
			Util.redimensionar(anterior);
			anterior.addActionListener(new AccionPageByPageUsuarios(_frame, _startIndex-_count, _count,_test,_user));
    		anterior.setPreferredSize(new Dimension(_panelBotones.getHeight()/3,_panelBotones.getWidth()/5));
    		botones.add(anterior);
    	}
    	
    	if((_startIndex+_count) < nUsuarios){
    		if(_startIndex>0){
    		botones.remove(ultimo-2);}else{
    			botones.remove(ultimo-1);
    			
    		}
        	BotonPersonalizado siguiente = Util.BotonUsuario(ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_siguiente_usuarios"), "lib//Resources//siguiente.png");
        	siguiente.setFocusable(true);
   			/*siguiente.setBorder(new LineBorder(Color.black, 10));
			siguiente.addMouseListener(new accionRaton(siguiente, Color.orange));
			siguiente.setColorMouseOver(Color.orange);*/
			Util.redimensionar(siguiente);

			siguiente.addFocusListener(new AccionFocoCreditos(siguiente));        	
        	siguiente.addActionListener(new AccionPageByPageUsuarios(_frame, _startIndex+_count, _count,_test,_user));
    		siguiente.setPreferredSize(new Dimension(_panelBotones.getHeight()/3,_panelBotones.getWidth()/5));
    		botones.add(siguiente);
    	}
    	
    	BotonPersonalizado ayuda = Util.BotonUsuario(ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_popup_admin_ayuda"), "lib//help.png");
    	ayuda.setFocusable(true);
		ayuda.setPreferredSize(new Dimension(_panelBotones.getHeight()/3,_panelBotones.getWidth()/5));
		ayuda.addFocusListener(new AccionFocoCreditos(ayuda));
		Util.redimensionar(ayuda);

		/*ayuda.setBorder(new LineBorder(Color.black, 10));
		ayuda.addMouseListener(new accionRaton(ayuda, Color.orange));
		ayuda.setColorMouseOver(Color.orange);*/
    	BotonPersonalizado salir = Util.BotonUsuario(ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_menu_admin_salir"), "lib//shutdown.png");
    	salir.setFocusable(true);
		Util.redimensionar(salir);

		/*salir.setBorder(new LineBorder(Color.black, 10));
		salir.addMouseListener(new accionRaton(salir, Color.orange));
		salir.setColorMouseOver(Color.orange);*/
		salir.addFocusListener(new AccionFocoCreditos(salir));
		salir.setPreferredSize(new Dimension(_panelBotones.getHeight()/3,_panelBotones.getWidth()/5));
		if(!_test){
        salir.addActionListener(new AccionSalir());}else{
        	
        	salir.addActionListener(new AccionMostrarMenuAdmin(_user,_frame));
        }
		
    	botones.add(ayuda);
    	botones.add(salir);
    	
		c.gridwidth = 1;
		c.gridheight = 1;
		
    	for(int i = 0; i<botones.size()-2; i=i+5){
    		for(int j = i; j<i+5; j++){
    			if(j<botones.size()-2){
    				if(botones.get(j)!=null){
    		    		c.gridx = j % 5; //Modulo
    		    		c.gridy = j / 5;
    		    		switch (c.gridy){
    		    			case 0:  
    		    				gridbag.setConstraints(botones.get(j), c);
    		    				_panelBotones.add(botones.get(j));
    		    				break;
    		    			case 1:  
    		    				gridbag.setConstraints(botones.get(j), c);
    		    				_panelBotones.add(botones.get(j));
    		    				break;
    		    			case 2:  
    		    				gridbag.setConstraints(botones.get(j), c);
    		    				_panelBotones.add(botones.get(j));
    		    				break;
    		    		}
    				}
    			}	
    		}	
    	}
    	
    	//Rellenamos el panel con botones invisibles
    	if(botones.size()-(2) <= 5){
    		if(botones.size()-(2) < 5){
    			for(int i = botones.size()-(2); i<5; i++ ){
        		c.gridy = 0;
        		c.gridx = i;
        		

        		JLabel boton = Util.BotonInvisible("lib//transparente.png", botones.get(0));
    			boton.setPreferredSize(new Dimension(_panelBotones.getHeight()/3,_panelBotones.getWidth()/5));

    			gridbag.setConstraints(boton, c);
    			_panelBotones.add(boton);}
    		}
    		c.gridy = 1;
    		c.gridx = 0;
    		

    		JLabel boton2 = Util.BotonInvisible("lib//transparente.png", botones.get(0));
			boton2.setPreferredSize(new Dimension(_panelBotones.getHeight()/3,_panelBotones.getWidth()/5));

			gridbag.setConstraints(boton2, c);
			_panelBotones.add(boton2);
    	}
    	
		c.gridx = 3; 
		c.gridy = 2;
		ayuda.addActionListener(new AccionLanzarAyuda(_frame));
		gridbag.setConstraints(ayuda, c);
		_panelBotones.add(ayuda);
		c.gridx = 4; 
		c.gridy = 2;
		gridbag.setConstraints(salir, c);
		_panelBotones.add(salir);

		_botones = botones;
		_frame.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height-altoDock));
	       _frame.pack();
	         _frame.repaint();
    }

	public TransicionBotones getPolicy() {
		return policy;
	}

	public void setPolicy(TransicionBotones policy) {
		this.policy = policy;
	}

	public AccionFocoVentana getFoco() {
		return foco;
	}

	public void setFoco(AccionFocoVentana foco) {
		this.foco = foco;
	}
    
    
    
}
